home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / DesktopDoubler / Nub / Display.c < prev    next >
Text File  |  1999-06-26  |  7KB  |  336 lines

  1. #define DISABLE_LOCAL_CALLTRACE        1        // Set to 1 to disable Call Traces for this file.
  2. #define DISABLE_LOCAL_DEBUG            0        // Set to 1 to disable all debugging for this file.
  3. #include "DebugUtils.h"
  4.  
  5. #include <LowMem.h>
  6. #include "ContextUtils.h"
  7. #include "Display.h"
  8. #include "DisplayManager.h"
  9. #include "ProcInfo.h"
  10.  
  11.  
  12.  
  13.  
  14.  
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18.  
  19. #if PRAGMA_ALIGN_SUPPORTED
  20. #pragma options align=mac68k
  21. #endif
  22.  
  23. typedef struct NewSysWindowPB
  24. {
  25.     Rect                    *bounds;
  26.     StringPtr                title;
  27.     Boolean                    visible;
  28.     short                    procID;
  29.     WindowPtr                behind;
  30.     Boolean                    goAwayFlag;
  31.     SInt32                     refcon;
  32.     SysWindowHandlerUPP        handler;
  33.     RgnHandle                rgn;
  34. } NewSysWindowPB;
  35.  
  36. #if PRAGMA_ALIGN_SUPPORTED
  37. #pragma options align=reset
  38. #endif
  39.  
  40. static pascal OSErr SysWindowHandler(WindowPtr window,EventRecord *event,SInt16 part,Boolean *handled);
  41. static pascal OSErr DragTrackingHandler(DragTrackingMessage message,WindowPtr window,void *refcon,DragReference drag);
  42.  
  43. #ifdef __cplusplus
  44. }
  45. #endif
  46.  
  47.  
  48.  
  49.  
  50.  
  51. static short gNewSysWindowGlue[] = {    0x4E56, 0x0000, 0x2F0A, 0x246E, 0x0008, 0x594F,
  52.                                         0x2F12, 0x2F2A, 0x0004, 0x1F2A, 0x0008, 0x3F2A,
  53.                                         0x000A, 0x2F2A, 0x000C, 0x1F2A, 0x0010, 0x2F2A,
  54.                                         0x0012, 0x2F2A, 0x0016, 0x2F2A, 0x001A, 0x3F3C,
  55.                                         0x005A, 0xA88F, 0x205F, 0x2008, 0x245F, 0x4E5E,
  56.                                         0x4E75 };
  57. #if GENERATINGPOWERPC
  58.     static RoutineDescriptor                gSysWindowHandlerRD = BUILD_ROUTINE_DESCRIPTOR(uppSysWindowHandlerProcInfo,SysWindowHandler);
  59.     static SysWindowHandlerUPP                gSysWindowHandlerUPP = (RoutineDescriptor*)&gSysWindowHandlerRD;
  60.     static RoutineDescriptor                gDragTrackingHandlerRD = BUILD_ROUTINE_DESCRIPTOR(uppDragTrackingHandlerProcInfo,DragTrackingHandler);
  61.     static DragTrackingHandlerUPP            gDragTrackingHandlerUPP = (RoutineDescriptor*)&gDragTrackingHandlerRD;
  62. #else
  63.     static SysWindowHandlerUPP                gSysWindowHandlerUPP = SysWindowHandler;
  64.     static DragTrackingHandlerUPP            gDragTrackingHandlerUPP = DragTrackingHandler;
  65. #endif
  66.  
  67. extern DisplayManager                        *gDMan;
  68.  
  69.  
  70.  
  71.  
  72.  
  73. Display::Display(UInt32 index)
  74. {
  75.     fIndex = index;
  76.     fGDev = NULL;
  77.     fDisplayID = NULL;
  78.     fCloneDisplay = false;
  79.     fCoverWindow = NULL;
  80.     fMBarWindow = NULL;
  81. }
  82.  
  83.  
  84.  
  85.  
  86.  
  87. Display::~Display(void)
  88. {
  89.     
  90. }
  91.  
  92.  
  93.  
  94.  
  95.  
  96. OSStatus Display::Create(GDHandle gdevToClone,DisplayIDType displayID,Boolean clone)
  97. {
  98.     RGBColor    black = { 0, 0, 0 };
  99.     GrafPtr        port;
  100.     Rect        bounds;
  101.     OSStatus    err;
  102.     
  103.     
  104.     if (clone)
  105.         fGDev = gdevToClone;
  106.     else
  107.     {
  108.         err = DMNewDisplay(&fGDev,gdevToClone[0]->gdRefNum,gdevToClone[0]->gdMode,0,displayID,0,NULL);
  109.         if (err != noErr)
  110.         {
  111.             dprintf(kDConPrefix "DMNewDisplay failed: %ld",err);
  112.             return err;
  113.         }
  114.     }
  115.     
  116.     DMGetDisplayIDByGDevice(fGDev,&fDisplayID,false);
  117.     fCloneDisplay = clone;
  118.     
  119.     bounds = fGDev[0]->gdRect;
  120.     bounds.top += LMGetMBarHeight();
  121.     InsetRect(&bounds,1,1);
  122.     fCoverWindow = NewSysWindow(&bounds,"\p",false,plainDBox,(WindowPtr)(-1L),false,this,NULL);
  123.     dAssert(fCoverWindow != NULL);
  124.     if (fCoverWindow == NULL)
  125.         return -1;
  126.     
  127.     if (InstallTrackingHandler != NULL)
  128.     {
  129.         err = InstallTrackingHandler(gDragTrackingHandlerUPP,fCoverWindow,this);
  130.         if (err != noErr)
  131.             dprintf(kDConPrefix "InstallTrackingHandler failed: %ld\n",err);
  132.     }
  133.     
  134.     GetPort(&port);
  135.     SetPort(fCoverWindow);
  136.     RGBBackColor(&black);
  137.     SetPort(port);
  138.     ShowWindow(fCoverWindow);
  139.     
  140.     bounds = fGDev[0]->gdRect;
  141.     bounds.bottom = bounds.top + LMGetMBarHeight();
  142.     InsetRect(&bounds,1,1);
  143.     fMBarWindow = NewSysWindow(&bounds,"\p",true,plainDBox,(WindowPtr)(-1L),false,this,NULL);
  144.     dAssert(fMBarWindow != NULL);
  145.     if (fMBarWindow == NULL)
  146.         return -1;
  147.     
  148.     dprintf(kDConPrefix "Display::Create: index = %ld, displayID = $%08lX\n",fIndex,displayID);
  149.     return noErr;
  150. }
  151.  
  152.  
  153.  
  154.  
  155.  
  156. void Display::Destroy(void)
  157. {
  158.     OSStatus    err;
  159.     
  160.     
  161.     dprintf(kDConPrefix "Display::Destroy: index = %ld, displayID = $%08lX\n",fIndex,fDisplayID);
  162.     
  163.     if (fMBarWindow != NULL)
  164.     {
  165.         DisposeSysWindow(fMBarWindow);
  166.         fMBarWindow = NULL;
  167.     }
  168.     
  169.     if (fCoverWindow != NULL)
  170.     {
  171.         if (RemoveTrackingHandler != NULL)
  172.             RemoveTrackingHandler(gDragTrackingHandlerUPP,fCoverWindow);
  173.         
  174.         DisposeSysWindow(fCoverWindow);
  175.         fCoverWindow = NULL;
  176.     }
  177.     
  178.     if ((fGDev != NULL) && !fCloneDisplay)
  179.     {
  180.         err = DMRemoveDisplay(fGDev,NULL);
  181.         if (err != noErr)
  182.             dprintf(kDConPrefix "DMRemoveDisplay failed: %ld",err);
  183.         
  184.         fGDev = NULL;
  185.     }
  186. }
  187.  
  188.  
  189.  
  190.  
  191.  
  192. void Display::MoveTo(SInt16 x,SInt16 y)
  193. {
  194.     if (fCoverWindow != NULL)
  195.         MoveWindow(fCoverWindow,x,y + LMGetMBarHeight(),false);
  196.     if (fMBarWindow != NULL)
  197.         MoveWindow(fMBarWindow,x,y,false);
  198. }
  199.  
  200.  
  201.  
  202.  
  203.  
  204. Boolean Display::Contains(Point where)
  205. {
  206.     return PtInRect(where,&fGDev[0]->gdRect);
  207. }
  208.  
  209.  
  210.  
  211.  
  212.  
  213. void Display::ShowHide(Boolean show)
  214. {
  215.     ::ShowHide(fCoverWindow,show);
  216. }
  217.  
  218.  
  219.  
  220.  
  221.  
  222. Boolean Display::EventHandler(WindowPtr window,EventRecord *event,SInt16 part)
  223. {
  224.     Boolean    handled = true;
  225.     
  226.     
  227.     switch(event->what)
  228.     {
  229.         case mouseDown:
  230.             if (window == fMBarWindow)
  231.             {
  232.                 gDMan->MBarClick(this,event->where);
  233.                 break;
  234.             }
  235.             
  236.             goto unhandled;
  237.             break;
  238.         
  239.         case updateEvt:
  240.             BeginUpdate(window);
  241.             EndUpdate(window);
  242.             break;
  243.         
  244.         case osEvt:
  245.             if (((event->message >> 24) & 0xFF) == mouseMovedMessage)
  246.                 break;
  247.             goto unhandled;
  248.             break;
  249.         
  250.         unhandled:
  251.         default:
  252.             dprintf(kDConPrefix "EventHandler: window = $%08lX, what = %ld, msg = $%08lX, where = %ld,%ld, part = %ld\n",
  253.                     window,event->what,event->message,event->where.h,event->where.v,part);
  254.             handled = false;
  255.             break;
  256.         }
  257.     
  258.     return handled;
  259. }
  260.  
  261.  
  262. #if 0
  263. #pragma mark -
  264. #endif
  265.  
  266.  
  267. WindowPtr NewSysWindow(Rect *bounds,StringPtr title,Boolean visible,SInt16 procID,WindowPtr behind,
  268.                         Boolean goAwayFlag,SysWinHandler *handler,RgnHandle rgn)
  269. {
  270.     NewSysWindowPB    pb;
  271.     SInt32            result;
  272.     
  273.     
  274.     pb.bounds = (Rect*)bounds;
  275.     pb.title = (StringPtr)title;
  276.     pb.visible = visible;
  277.     pb.procID = procID;
  278.     pb.behind = behind;
  279.     pb.goAwayFlag = goAwayFlag;
  280.     pb.refcon = (SInt32)handler;
  281.     pb.handler = gSysWindowHandlerUPP;
  282.     pb.rgn = rgn;
  283.     
  284.     result = CallUniversalProc((UniversalProcPtr)gNewSysWindowGlue,
  285.         kCStackBased
  286.         | RESULT_SIZE(SIZE_CODE(sizeof(WindowPtr)))
  287.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NewSysWindowPB*))),
  288.         &pb);
  289.     
  290.     return *(((WindowPtr*)&result) + RESULT_OFFSET(WindowPtr));
  291. }
  292.  
  293.  
  294.  
  295.  
  296.  
  297. OSErr DisposeSysWindow(WindowPtr window)
  298. {
  299.     SInt32    result;
  300.     
  301.     
  302.     result = CallUniversalProc(NGetTrapAddress(0xA88F,ToolTrap),
  303.         kPascalStackBased
  304.         | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
  305.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(WindowPtr)))
  306.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(UInt16))),
  307.         window,
  308.         0x005B);
  309.     
  310.     return *(((OSErr*)&result) + RESULT_OFFSET(OSErr));
  311. }
  312.  
  313.  
  314.  
  315.  
  316.  
  317. pascal OSErr SysWindowHandler(WindowPtr window,EventRecord *event,SInt16 part,Boolean *handled)
  318. {
  319.     GlobalContext    globals;
  320.     THzContext        zone(SystemZone());
  321.     
  322.     
  323.     *handled = ((SysWinHandler*)((WindowPeek)window)->refCon)->EventHandler(window,event,part);
  324.     return noErr;
  325. }
  326.  
  327.  
  328.  
  329.  
  330.  
  331. pascal OSErr DragTrackingHandler(DragTrackingMessage message,WindowPtr window,void *refcon,DragReference drag)
  332. {
  333.     gDMan->Swap((Display*)refcon);
  334.     return -1;
  335. }
  336.